package com.rf.richfitwheel.admin.sys.service;

import java.util.List;
import java.util.Map;
import java.util.Set;

import com.rf.richfitwheel.admin.sys.model.MenuBean;
import com.rf.richfitwheel.admin.sys.model.Menu;
import com.rf.richfitwheel.admin.sys.model.User;
import com.rf.richfitwheel.admin.sys.vo.UserVO;
import com.rf.richfitwheel.common.utils.TreeUtils;

import net.sf.json.JSONObject;

/**
 * 菜单管理
 * 
 * @author hushouquan
 * @date 2018-11-26
 */
public interface SysMenuService{

	/**
	 * 导航菜单,常用菜单可选范围
	 * @param id
	 * @param terminal
	 * @return
	 */
    List<Map<String,Object>> getCommUseMenuSetTree(String id, String terminal);

	/**
	 * 查询已设置的常用菜单
	 * @param id
	 * @param terminal
	 * @return
	 */
	List<MenuBean> getMenuCheckList(String id, String terminal);
	
	/**
	 * 根据父菜单，查询子菜单
	 * @param parentId 父菜单ID
	 * @param menuIdList  用户菜单ID
	 */
	List<MenuBean> queryListParentId(String parentId, List<String> menuIdList);
	
	/**
	 * 根据父菜单，查询子菜单
	 * @param parentId 父菜单ID
	 */
	List<MenuBean> queryListParentId(String parentId);
	
	/**
	 * 获取不包含按钮的菜单列表
	 */
	List<MenuBean> queryNotButtonList();
	
	/**
	 * 获取用户菜单列表
	 */
	List<MenuBean> getUserMenuList(String userId);
	
	/**
	 * 删除
	 */
	void delete(String menuId);
	
	/**
	 * 全部菜单
	 * @param object
	 * @return
	 */
	List<Menu> selectList(JSONObject object);
	
	/**
	 * 根据id查询菜单
	 * @param parentId
	 * @return
	 */
	Menu selectById(String parentId);
	
	/**
	 * 新增菜单
	 * @param menu
	 */
	void insert(Menu menu);
	
	/**
	 * 修改菜单
	 * @param menu
	 */
	void updateById(Menu menu);
	
	/**
	 * 全量菜单
	 * @return
	 * @throws Exception
	 */
	List<TreeUtils> gerResTree() throws Exception ;
	
	/**
	 * 查询按钮权限列表
	 * @param id 用户id
	 * @return
	 */
	Set<String> getUserPermissions(String id);
	
	/**
	 * 导航菜单,顶级菜单
	 * @param userId
	 * @return
	 */
	List<MenuBean> getUserMenuListTopLevel(String userId);
	
	/**
	 * 导航菜单,常用菜单，已选择的菜单
	 * @param userId
	 * @return
	 */
	List<MenuBean> getCommUseMenuTree(String userId);
	
	/**
	 * 导航菜单,常用菜单，已选择的菜单
	 * @param userId
	 * @param terminal
	 * @return
	 */
	List<MenuBean> getCommUseMenuTree(String userId, String terminal);
	
	/**
	 * 导航菜单,常用菜单选择树
	 * @param userId
	 * @return
	 */
	List<Map<String, Object>> getCommUseMenuSetTree(String userId);
	
	/**
	 * 设置常用菜单
	 * @param ids 选中节点的id数组
	 * @param userVO 当前用户
	 */
	void saveCommUseMenu(String[] ids, UserVO userVO);
	/**
	 * 记录用户菜单点击
	 * @param menuId
	 * @param userVO
	 * @throws Exception
	 */
	void menuClick(String menuId, UserVO userVO) throws Exception;
	
	/**
	 * 根据菜单终端类型获取菜单树，如果不是超级管理员只返回自己租户的资源
	 * @param terminals 终端
	 * @param userVO
	 * @return
	 * @throws Exception
	 */
	List<TreeUtils> gerResTreeByTerminal(List<String> terminals, UserVO userVO) throws Exception ;
	
	/**
	 * 根据终端获取导航菜单
	 * @param id
	 * @param terminal
	 * @return
	 */
	List<MenuBean> getUserMenuList(String id, String terminal, String sessionId);
	
	/**
	 * 根据终端获取有权限的按钮
	 * @param id
	 * @param terminal
	 * @return
	 */
	Set<String> getUserPermissions(String id, String terminal);
	
	/**
	 * 根据终端去常用菜单
	 * @param id
	 * @param terminals
	 * @return
	 */
	List<MenuBean> getCommUseMenuTreeByTerminal(String id, String[] terminals);
	
	/**
	 * 获取用户菜单列表,给系统外连接传sessionI
	 * @param userId
	 * @param sessionId
	 * @return
	 */
	List<MenuBean> getUserMenuList(String userId, String sessionId);
	
	
	/**
	 * 根据菜单终端类型获取菜单树,增加一个顶级节点
	 * @param tList
	 * @return
	 */
	List<TreeUtils> getResByTerminalDisableParent(List<String> tList) throws Exception;


	/**
	 * 根据所属模块获取所有非按钮的菜单列表
	 * @param moduleType
	 * @return
	 */
	List<MenuBean> queryByModuleNotButtonList(String moduleType);


	/**
	 * 根据模块获取所有非按钮的菜单列表
	 * @param userVO
	 * @param moduleType
	 * @return
	 * @throws Exception
	 */
	List<TreeUtils> gerResTreeByModuleType(UserVO userVO,String moduleType) throws Exception ;


	/**
	 * 根据终端获取用户所有部门菜单导航菜单
	 * @param id
	 * @param terminal
	 * @return
	 */
	List<MenuBean> getUserAllMenuList(String id, String terminal, String sessionId);

	/**
	 * 获取用户有权限的模块(当前管理的机构)
	 * @param user
	 * @return
	 */
	List<Map<String, Object>> getUserModulesPermissions(UserVO user);

	/**
	 * 根据终端和模块获取当前登陆用户的导航菜单
	 * @param id 用户id
	 * @param terminal 终端 {@Link com.rf.richfitwheel.common.contants.Constant.TerminalType}
	 * @param module 模块 {@Link com.rf.richfitwheel.common.contants.Constant.SystemModule}
	 * @param sessionId 会话id
	 * @return 导航菜单
	 */
	List<MenuBean> getUserMenuList(String id, String terminal, String module, String sessionId);
}
